#include <p18f452.h>
#include <stdio.h>
#include <adc.h>
#include <delays.h>
#include <stdlib.h>
#include <math.h>
#include "LCD4b2x16.h"


void	init(void);
int 	adc(unsigned char);
void 	lcd (float);


#define RESOLUCION 0.004882812


#pragma udata seccion_datos=  0x200

float	ch0= 0,
		ch1= 0,
		ch2= 0,
		ch3= 0;

unsigned char buffer[10], i, array[10];

float 	posicion=0,
		errorPos=0,
		par=0,
		velocidad=0;


void main( void )
{
	init();

	while(1){

		Comando_LCD(CURSOR_HOME);

	//Posicion		
		ch0 =adc(ADC_CH0);
		ch0 = (ch0 * RESOLUCION);//*1000;	//mVoltios
		
		posicion= 	(-50.70888249*(ch0)+ 365.98354)*10;
//		itoa((int)posicion,buffer);
		
		Datos_LCD("Po:");
		lcd(posicion);
		Datos_LCD("G");


	//Error de Posicion
		ch1 =adc(ADC_CH1);
		ch1 = (ch1 * RESOLUCION);//*1000;	//mVoltios

		errorPos=	(-115.5598*(ch1) + 281.9823)*10;

		Datos_LCD(" Er:");
		lcd(errorPos);
		Datos_LCD("G");
		

			Comando_LCD(DDRAM_LINEA_2);


	}
}


void lcd(float value){

	itoa((int)value, buffer);

	if (value > 0)
		i= 0;
	else
	{
		i= 1;
		Dato_LCD(buffer[0]);
	}

	Dato_LCD(buffer[i]);

	if( (value < 100 && value > 0) || (value > -100 && value <0) )
		Dato_LCD(',');

	Dato_LCD(buffer[i+1]);

	if( (value < 1000 && value > 0) || (value > -1000 && value <0) )
		Dato_LCD(',');

	Dato_LCD(buffer[i+2]);

	if( value > 1000 || value < -1000 )
		Dato_LCD(',');

	Dato_LCD(buffer[i+3]);
}

void init( void ){

	ADCON1 =0b00001101;	//Pines AN0, AN1 (analogicos)
	TRISA =0x0F;		//Puerto A (mitad entrada-salida)
	TRISE= 0x00;
	TRISC= 0x00;

	Inicializa_LCD();
	Comando_LCD(FOUR_BIT);
	Comando_LCD(DON);
	Comando_LCD(CURSOR_OFF);
	Comando_LCD(BLINK_OFF);

// Configuro Modulo ADC
	OpenADC( ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_3ANA_0REF,  ADC_INT_OFF );//ADC_CH0 &

	for(i=0; i< 10; ++i)
		buffer[i]=0;
}

// ------- Subrutinas ADC --------

int adc(unsigned char canal)
{
	SetChanADC( canal );  	// fijar el canal de comversion (RC0 a RC7 canales analogicos)
	ConvertADC(); 			// empieza a convertir
	while( BusyADC()){}		// espera la conversion
	return ReadADC(); 		//Lee y retorna el valor de la conversion   
}

//Nota: Se coloco para dos canales y se debe acomodas la coma para 10//